#ifndef NLSATURATION_H
#define NLSATURATION_H
#include "NonlinearityBase.h"
#include <math.h>

// Przestrzeń nazw
namespace RafMat
{
namespace SimEngine
{

class NLSaturation : public NonlinearityBase
{
public:
    /**
        Konstruktor nieliniowości w postaci nasycenia.
        Konstruktor wiąże regulator z konkretnym obiektem symulatora.
        Domyślnie jest to regulator o wzmocnieniu jednostkowym

        \param [in] isim Obiekt symulatora-właściciela tego regulatora.
        \param [in] gain Wzmocnienie regulatora (parametr k).
    */
    explicit NLSaturation(const SimInterface::ISimulator &isim, double wrokingPoint = 0, double nonlinearityGain = 0.2);

    //
    // Implementacja IConfigurable
    //

    /** Ustawia parametr (\see IConfigurable::setParameter). */
    bool setParameter(const std::string& param, const std::string& value) throw(std::logic_error);

    /** Odczytuje parametr (\see IConfigurable::getParameter). */
    std::string getParameter(const std::string& param) const throw(std::logic_error);

    /**
        Resetuje nasycenie (dla nasycenia nie robi nic).
    */
    void reset();


protected:

    /**
        Realizuje pojedyńczy krok wpływu nieliniowości.

        Funkcja implementuje abstrakcyjną metodę z klasy bazowej NonlinearityBase.
        Realizuje nieliniowość w postaci nasycenia.

        \param [in] setPoint Wartość zadana.
        \param [in] processVar Wartość zmiennej procesowej (np. ze sprzężenia zwrotnego).
        \return Wartość wyjścia regulatora.
    */
    double simulateNonlinearityStep(double objectOutput);

    /**
        Wyrzuca parametry do strumienia konfiguracyjnego.
    */
    SimFile::ConfigWriter& dumpSpecificPar(SimFile::ConfigWriter& o) const;

private:
    // Stałe konfiguracyjne
    static const std::string CONF_ALL;
    static const std::string CONF_WORKING_POINT;
    static const std::string CONF_NONLINEARITY_GAIN;

    /**
        Ustawia wszystkie parametry Saturacji.
        Funkcja daje silną gwarancję bezpieczeństwa.

        \param [in] values Parametry regulatora w forme wektora [ ... ].
    */
    void safeSetParameters(const std::string& values);

    double m_WorkingPoint;      ///< Punkt pracy
    double m_NonlinearityGain;  ///< Wzmocnienie statyczne dla nieliniowości poza punktem pracy
};



}
}

#endif // NLSATURATION_H
